/**
 * {作业名称}
 *
 * 输入参数:
 *
 * 输出参数:
 *
 */
(() => {
  // 私有区域

  return function ({ UID, Records, CustomID }) {
    // 验证输入参数
    if (!UID) throw Error("无效会话");

    // 处理逻辑
    A.db.trans('MP', conn => {
      // 验证所有组装单,确保已记账
      const { Rows: postedRecords } = A.job.CardR(UID, 'ST.组装单', ['组装日期'], [['ID', 'in', Records.map(r => r.ID)], ['组装日期', 'is', null]]);
      if (postedRecords.length > 0) throw Error("不能使用未记账的组装单");

      // 加载组装单明细
      const { Rows } = A.job.CardR(UID, 'ST.组装单明细', ['组装单', '组装单.仓库', '品规', '品规.零售价', '数量'],
        [['组装单', 'in', Records.map(r => r.ID)]]);

      // 验证是否同一个仓库
      const repo = Rows[0]['组装单.仓库'];
      if (Rows.some(r => r['组装单.仓库'] !== repo)) throw Error("请选择相同仓库的组装单");

      // 生成出库单
      const bill = {
        ID: A.guid(),
        仓库: repo,
        客户: CustomID,
        总数量: 0,
        总金额: 0,
      };
      // 生成出库单明细
      const details = Rows.map(r => ({
        出库单: bill.ID,
        品规: r.品规,
        数量: r.数量,
        单价: r['品规.零售价'],
        金额: r['品规.零售价'] * r.数量,
      }));

      A.job.CardW(UID, 'ST.出库单', null, bill);
      A.job.CardW(UID, 'ST.出库单明细', null, details);
    });

    // 返回结果
    return true;
  };
})()